package com.lyb.statement.impl;

import com.lyb.Utils;
import com.lyb.constant.StatusConstant;
import com.lyb.constant.SystemConstant;
import com.lyb.hardware.AlpacaMainBoard;
import com.lyb.statement.ExecutableStatement;

import java.util.Map;

/**
 * "!"语句的处理类
 *
 * @author Mr.Alpaca potato
 * @version 1.4.0
 */
public class DeviceStatement implements ExecutableStatement {
    /**
     * 表示该类负责处理的可执行语句字符串
     */
    private final static String STATEMENT = "!";

    public DeviceStatement() {
    }

    /**
     * 格式判断，输入语句需满足格式为：
     * 1."![设备种类][运行时间]"
     * 2.设备种类为A、B、C三者之一
     * 3.运行时间为整数，以秒为单位
     *
     * @param row   当前语句行数
     * @param input 输入语句
     * @return 判断结果
     */
    @Override
    public boolean formatJudge(int row, String input) {
        /* 将语句按"!"切分后判断 */
        String[] split = input.split(STATEMENT);
        /* 若设备名不为指定设备则报错 */
        if (split[1].charAt(0) != 'A' && split[1].charAt(0) != 'B' && split[1].charAt(0) != 'C') {
            Utils.log("[系统|编译器]: 第 " + row + " 行: 参数 \"" + split[1].charAt(0) + "\" 不是合法设备名");
            return false;
        }
        /* 若执行时间非数字则错误 */
        if (!Utils.isNumber(String.valueOf(split[1].charAt(1)))) {
            Utils.log("[系统|编译器]: 第 " + row + " 行: 参数 \"" + split[1].charAt(1) + "\" 不是合法时间");
            return false;
        }
        return true;
    }

    /**
     * 执行该语句，修改进程状态字和阻塞原因
     *
     * @param statement   输入语句
     * @param variableMap 储存各变量值
     */
    @Override
    public void execute(String statement, Map<String, Double> variableMap) {
        /* 除去感叹号 */
        String description = statement.replace("!", "");
        /* 修改进程状态字和阻塞原因 */
        AlpacaMainBoard mainBoard = SystemConstant.MAIN_BOARD;
        mainBoard.setCpuCurrentPcbPsw(StatusConstant.IO_BLOCK);
        mainBoard.setCpuCurrentPcbDescription(description);
    }

    /**
     * 获得该类负责处理的可执行语句字符串
     *
     * @return 可执行语句字符串
     */
    @Override
    public String getStatement() {
        return STATEMENT;
    }
}
